home *** CD-ROM | disk | FTP | other *** search
/ The Mac Mega CD - Killer Software / The Mac Mega CD - Killer Software (May 1996).dmg / Shareware City / Sound / MacMikMod 2.10+src / source / mikmod.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-04  |  15.6 KB  |  584 lines  |  [TEXT/CWIE]

  1. #ifndef MIKMOD_H
  2. #define MIKMOD_H
  3.  
  4. #include <stdio.h>
  5. #include "mtypes.h"            /* include atomic mikmod types */
  6.  
  7.  
  8. #define mikbanner \
  9. "=======================================================================\n" \
  10. "MIKMOD v2.10 - Portable version -  Programmed by MikMak of HaRDCoDE '95\n" \
  11. "-----------------------------------------------------------------------\n" \
  12. "Macintosh Sound Driver (MSD) • Copyright © 1996 Dmitry Boldyrev [DEMOS]\n" \
  13. "=======================================================================\n" \
  14. "This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \
  15. "E-Mail : mikmak@stack.urc.tue.nl\n"
  16.  
  17. /*
  18.     error variables:
  19.     ===============
  20. */
  21.  
  22. extern char *ERROR_ALLOC_STRUCT;
  23. extern char *ERROR_LOADING_PATTERN;
  24. extern char *ERROR_LOADING_TRACK;
  25. extern char *ERROR_LOADING_HEADER;
  26. extern char *ERROR_NOT_A_MODULE;
  27. extern char *ERROR_LOADING_SAMPLEINFO;
  28. extern char *ERROR_OUT_OF_HANDLES;
  29. extern char *ERROR_SAMPLE_TOO_BIG;
  30. extern char *myerr;
  31.  
  32.  
  33.  
  34. #define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)
  35. int  _mm_fseek(FILE *stream,long offset,int whence);
  36. void _mm_setiobase(long iobase);
  37. long _mm_ftell(FILE *stream);
  38.  
  39.  
  40. extern SBYTE  _mm_read_SBYTE   (FILE *fp);
  41. extern UBYTE _mm_read_UBYTE  (FILE *fp);
  42.  
  43. extern SWORD  _mm_read_M_SWORD (FILE *fp);
  44. extern SWORD  _mm_read_I_SWORD (FILE *fp);
  45.  
  46. extern UWORD _mm_read_M_UWORD(FILE *fp);
  47. extern UWORD _mm_read_I_UWORD(FILE *fp);
  48.  
  49. extern SLONG  _mm_read_M_SLONG (FILE *fp);
  50. extern SLONG  _mm_read_I_SLONG (FILE *fp);
  51.  
  52. extern ULONG _mm_read_M_ULONG(FILE *fp);
  53. extern ULONG _mm_read_I_ULONG(FILE *fp);
  54.  
  55. extern int _mm_read_str(char *str, int size, FILE *fp);
  56.  
  57. extern int _mm_read_SBYTES    (SBYTE  *buffer, int number, FILE *fp);
  58. extern int _mm_read_UBYTES   (UBYTE *buffer, int number, FILE *fp);
  59.  
  60. extern int _mm_read_M_SWORDS  (SWORD  *buffer, int number, FILE *fp);
  61. extern int _mm_read_I_SWORDS  (SWORD  *buffer, int number, FILE *fp);
  62.  
  63. extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);
  64. extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);
  65.  
  66. extern int _mm_read_M_SLONGS  (SLONG  *buffer, int number, FILE *fp);
  67. extern int _mm_read_I_SLONGS  (SLONG  *buffer, int number, FILE *fp);
  68.  
  69. extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);
  70. extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);
  71.  
  72.  
  73. extern void _mm_write_SBYTE        (SBYTE data,FILE *fp);
  74. extern void _mm_write_UBYTE     (UBYTE data,FILE *fp);
  75.  
  76. extern void _mm_write_M_SWORD    (SWORD data,FILE *fp);
  77. extern void _mm_write_I_SWORD    (SWORD data,FILE *fp);
  78.  
  79. extern void _mm_write_M_UWORD    (UWORD data,FILE *fp);
  80. extern void _mm_write_I_UWORD    (UWORD data,FILE *fp);
  81.  
  82. extern void _mm_write_M_SLONG    (SLONG data,FILE *fp);
  83. extern void _mm_write_I_SLONG    (SLONG data,FILE *fp);
  84.  
  85. extern void _mm_write_M_ULONG    (ULONG data,FILE *fp);
  86. extern void _mm_write_I_ULONG    (ULONG data,FILE *fp);
  87.  
  88. extern void _mm_write_SBYTES        (SBYTE *data,  int number,FILE *fp);
  89. extern void _mm_write_UBYTES     (UBYTE *data, int number,FILE *fp);
  90.  
  91. extern void _mm_write_M_SWORDS    (SWORD *data,  int number,FILE *fp);
  92. extern void _mm_write_I_SWORDS    (SWORD *data,  int number,FILE *fp);
  93.  
  94. extern void _mm_write_M_UWORDS    (UWORD *data, int number,FILE *fp);
  95. extern void _mm_write_I_UWORDS    (UWORD *data, int number,FILE *fp);
  96.  
  97. extern void _mm_write_M_SLONGS    (SLONG *data,  int number,FILE *fp);
  98. extern void _mm_write_I_SLONGS    (SLONG *data,  int number,FILE *fp);
  99.  
  100. extern void _mm_write_M_ULONGS    (ULONG *data, int number,FILE *fp);
  101. extern void _mm_write_I_ULONGS    (ULONG *data, int number,FILE *fp);
  102.  
  103.  
  104. /**************************************************************************
  105. ****** Unitrack stuff: ****************************************************
  106. **************************************************************************/
  107.  
  108. /*
  109.     prototypes:
  110. */
  111.  
  112. void     UniSetRow(UBYTE *t);
  113. UBYTE    UniGetByte(void);
  114. UBYTE  *UniFindRow(UBYTE *t,UWORD row);
  115. void       UniReset(void);
  116. void       UniWrite(UBYTE data);
  117. void       UniNewline(void);
  118. void     UniInstrument(UBYTE ins);
  119. void     UniNote(UBYTE note);
  120. void     UniPTEffect(UBYTE eff,UBYTE dat);
  121. UBYTE  *UniDup(void);
  122. void     UniSkipOpcode(UBYTE op);
  123. BOOL    UniInit(void);
  124. void    UniCleanup(void);
  125. UWORD   TrkLen(UBYTE *t);
  126. BOOL    MyCmp(UBYTE *a,UBYTE *b,UWORD l);
  127.  
  128. /*
  129.     all known effects:
  130. */
  131.  
  132. enum {
  133.         UNI_NOTE=1,
  134.         UNI_INSTRUMENT,
  135.         UNI_PTEFFECT0,
  136.         UNI_PTEFFECT1,
  137.         UNI_PTEFFECT2,
  138.         UNI_PTEFFECT3,
  139.         UNI_PTEFFECT4,
  140.         UNI_PTEFFECT5,
  141.         UNI_PTEFFECT6,
  142.         UNI_PTEFFECT7,
  143.         UNI_PTEFFECT8,
  144.         UNI_PTEFFECT9,
  145.         UNI_PTEFFECTA,
  146.         UNI_PTEFFECTB,
  147.         UNI_PTEFFECTC,
  148.         UNI_PTEFFECTD,
  149.         UNI_PTEFFECTE,
  150.         UNI_PTEFFECTF,
  151.         UNI_S3MEFFECTA,
  152.         UNI_S3MEFFECTD,
  153.         UNI_S3MEFFECTE,
  154.         UNI_S3MEFFECTF,
  155.         UNI_S3MEFFECTI,
  156.         UNI_S3MEFFECTQ,
  157.         UNI_S3MEFFECTT,
  158.         UNI_XMEFFECTA,
  159.                 UNI_XMEFFECTG,
  160.                 UNI_XMEFFECTH,
  161.         UNI_XMEFFECTP
  162. };
  163.  
  164.  
  165. /**************************************************************************
  166. ****** mikmod types: ******************************************************
  167. **************************************************************************/
  168.  
  169.  
  170. /*
  171.     Sample format flags:
  172. */
  173.  
  174. #define SF_16BITS       1
  175. #define SF_SIGNED       2
  176. #define SF_DELTA        4
  177. #define SF_BIG_ENDIAN    8
  178. #define SF_LOOP         16
  179. #define SF_BIDI         32
  180. #define SF_OWNPAN       64
  181. #define SF_REVERSE        128
  182.  
  183.  
  184. /*
  185.     Envelope flags:
  186. */
  187.  
  188. #define EF_ON           1
  189. #define EF_SUSTAIN      2
  190. #define EF_LOOP         4
  191.  
  192.  
  193. /*
  194.     Unimod flags
  195. */
  196.  
  197. #define UF_XMPERIODS    1               /* if set use XM periods/finetuning */
  198. #define UF_LINEAR       2               /* if set use LINEAR periods */
  199.  
  200.  
  201. typedef struct ENVPT{
  202.     SWORD pos;
  203.     SWORD val;
  204. } ENVPT;
  205.  
  206.  
  207. typedef struct SAMPLE{
  208.     UWORD c2spd;            /* finetune frequency */
  209.     SBYTE transpose;        /* transpose value */
  210.     UBYTE volume;           /* volume 0-64 */
  211.     UBYTE panning;          /* panning */
  212.     ULONG length;           /* length of sample (in samples!) */
  213.     ULONG loopstart;        /* repeat position (relative to start, in samples) */
  214.     ULONG loopend;          /* repeat end */
  215.     UWORD flags;            /* sample format */
  216.     ULONG seekpos;            /* seek position in file */
  217.     char *samplename;       /* name of the sample */
  218.     SWORD handle;           /* sample handle */
  219. } SAMPLE;
  220.  
  221.  
  222. typedef struct INSTRUMENT{
  223.     UBYTE numsmp;
  224.     UBYTE samplenumber[96];
  225.  
  226.     UBYTE volflg;           /* bit 0: on 1: sustain 2: loop */
  227.     UBYTE volpts;
  228.     UBYTE volsus;
  229.     UBYTE volbeg;
  230.     UBYTE volend;
  231.     ENVPT volenv[12];
  232.  
  233.     UBYTE panflg;           /* bit 0: on 1: sustain 2: loop */
  234.     UBYTE panpts;
  235.     UBYTE pansus;
  236.     UBYTE panbeg;
  237.     UBYTE panend;
  238.     ENVPT panenv[12];
  239.  
  240.     UBYTE vibtype;
  241.     UBYTE vibsweep;
  242.     UBYTE vibdepth;
  243.     UBYTE vibrate;
  244.  
  245.     UWORD volfade;
  246.     char  *insname;
  247.     SAMPLE *samples;
  248. } INSTRUMENT;
  249.  
  250.  
  251. /*
  252.     MikMod UNImod types:
  253.     ====================
  254. */
  255.  
  256. typedef struct UNIMOD{
  257.     UBYTE        numchn;            /* number of channels */
  258.     UWORD       numpos;         /* number of positions in this song */
  259.     UWORD        reppos;            /* restart position */
  260.     UWORD       numpat;         /* number of patterns in this song */
  261.     UWORD       numtrk;         /* number of tracks */
  262.     UWORD       numins;         /* number of samples */
  263.     UBYTE       initspeed;      /* */
  264.     UBYTE       inittempo;      /* */
  265.     UBYTE       positions[256]; /* all positions */
  266.     UBYTE       panning[32];      /* 32 panning positions */
  267.     UBYTE       flags;          /* */
  268.     char       *songname;       /* name of the song */
  269.     char       *modtype;        /* string type of module */
  270.     char       *comment;        /* module comments */
  271.     INSTRUMENT *instruments;    /* all samples */
  272.     UWORD      *patterns;       /* array of PATTERN */
  273.     UWORD      *pattrows;       /* array of number of rows for each pattern */
  274.     UBYTE     **tracks;         /* array of pointers to tracks */
  275. } UNIMOD;
  276.  
  277.  
  278. /**************************************************************************
  279. ****** Loader stuff: ******************************************************
  280. **************************************************************************/
  281.  
  282. /*
  283.     loader structure:
  284. */
  285.  
  286. typedef struct LOADER{
  287.     struct LOADER *next;
  288.     char    *type;
  289.     char     *version;
  290.     BOOL    (*Init)(void);
  291.     BOOL    (*Test)(void);
  292.     BOOL    (*Load)(void);
  293.     void    (*Cleanup)(void);
  294. } LOADER;
  295.  
  296.  
  297. /*
  298.     public loader variables:
  299. */
  300.  
  301. extern UNIMOD of;
  302. extern FILE *modfp;
  303. extern UWORD finetune[16];
  304.  
  305.  
  306. /*
  307.     main loader prototypes:
  308. */
  309.  
  310. void     ML_InfoLoader(void);
  311. void     ML_RegisterLoader(LOADER *ldr);
  312. UNIMOD    *ML_LoadFP(FILE *fp);
  313. UNIMOD    *ML_LoadFN(char *filename);
  314. void     ML_Free(UNIMOD *mf);
  315.  
  316.  
  317. /*
  318.     other loader prototypes: (used by the loader modules)
  319. */
  320.  
  321. BOOL     InitTracks(void);
  322. void     AddTrack(UBYTE *tr);
  323. BOOL     ReadComment(UWORD len);
  324. BOOL     AllocPatterns(void);
  325. BOOL     AllocTracks(void);
  326. BOOL     AllocInstruments(void);
  327. BOOL     AllocSamples(INSTRUMENT *i);
  328. char    *DupStr(char *s,UWORD len);
  329. void     *MyMalloc(size_t size);
  330. void     *MyCalloc(size_t nitems,size_t size);
  331.  
  332.  
  333. /*
  334.     Declare external loaders:
  335. */
  336. extern LOADER load_uni;
  337. extern LOADER load_mod;
  338. extern LOADER load_m15;
  339. extern LOADER load_mtm;
  340. extern LOADER load_s3m;
  341. extern LOADER load_stm;
  342. extern LOADER load_ult;
  343. extern LOADER load_xm;
  344.  
  345.  
  346. /**************************************************************************
  347. ****** Wavload stuff: *****************************************************
  348. **************************************************************************/
  349.  
  350. SAMPLE *MW_LoadWavFP(FILE *fp);
  351. SAMPLE *MW_LoadWavFN(char *filename);
  352. void MW_FreeWav(SAMPLE *si);
  353.  
  354.  
  355. /**************************************************************************
  356. ****** Driver stuff: ******************************************************
  357. **************************************************************************/
  358.  
  359. /*
  360.     max. number of handles a driver has to provide. (not strict)
  361. */
  362.  
  363. #define MAXSAMPLEHANDLES 128
  364.  
  365.  
  366. /*
  367.     possible mixing mode bits:
  368. */
  369.  
  370. #define DMODE_STEREO    1
  371. #define DMODE_16BITS    2
  372. #define DMODE_INTERP    4
  373.  
  374.  
  375. /*
  376.     driver structure:
  377. */
  378.  
  379. typedef struct DRIVER{
  380.     struct DRIVER *next;
  381.     char    *Name;
  382.     char    *Version;
  383.     BOOL    (*IsPresent)            (void);
  384.     SWORD   (*SampleLoad)           (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
  385.     void    (*SampleUnLoad)         (SWORD handle);
  386.     BOOL    (*Init)                 (void);
  387.     void    (*Exit)                 (void);
  388.     void    (*PlayStart)            (void);
  389.     void    (*PlayStop)             (void);
  390.     void    (*Update)               (void);
  391.     void     (*VoiceSetVolume)        (UBYTE voice,UBYTE vol);
  392.     void     (*VoiceSetFrequency)    (UBYTE voice,ULONG frq);
  393.     void     (*VoiceSetPanning)        (UBYTE voice,UBYTE pan);
  394.     void    (*VoicePlay)            (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
  395. } DRIVER;
  396.  
  397.  
  398. /*
  399.     public driver variables:
  400. */
  401.  
  402. extern DRIVER *md_driver;
  403. extern UWORD md_device;
  404. extern UWORD md_mixfreq;
  405. extern UWORD md_dmabufsize;
  406. extern UWORD md_mode;
  407. extern UBYTE md_numchn;
  408. extern UBYTE md_bpm;
  409. extern void (*md_player)(void);
  410.  
  411. /*
  412.     main driver prototypes:
  413. */
  414.  
  415. void MD_InfoDriver(void);
  416. void MD_RegisterDriver(DRIVER *drv);
  417. void MD_RegisterPlayer(void (*plr)(void));
  418. SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
  419. void MD_SampleUnLoad(SWORD handle);
  420. BOOL MD_Init(void);
  421. void MD_Exit(void);
  422. void MD_PlayStart(void);
  423. void MD_PlayStop(void);
  424. void MD_SetBPM(UBYTE bpm);
  425. void MD_Update(void);
  426. void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);
  427. void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);
  428. void MD_VoiceSetPanning(UBYTE voice,ULONG pan);
  429. void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
  430. void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);
  431. void SL_Load(void *buffer,ULONG length);
  432.  
  433. /*
  434.     Declare external drivers:
  435. */
  436.  
  437. extern DRIVER drv_gus;        /* gravis ultrasound driver */
  438. extern DRIVER drv_sb;        /* soundblaster DSP driver */
  439. extern DRIVER drv_ss;        /* ensoniq soundscape driver */
  440. extern DRIVER drv_nos;        /* nosound driver */
  441. extern DRIVER drv_raw;        /* file output driver */
  442. extern DRIVER drv_w95;        /* win95 driver */
  443. extern DRIVER drv_awe;        /* experimental SB-AWE driver */
  444. extern DRIVER drv_vox;        /* linux voxware driver */
  445. extern DRIVER drv_af;       /* Dec Alpha AudioFile driver */
  446. extern DRIVER drv_sun;      /* Sun driver */
  447. extern DRIVER drv_os2;      /* Os2 driver */
  448. extern DRIVER drv_tim;          /* timing driver */
  449. extern DRIVER drv_mac;          /* timing driver */
  450.  
  451. /**************************************************************************
  452. ****** Player stuff: ******************************************************
  453. **************************************************************************/
  454.  
  455.  
  456. typedef struct ENVPR{
  457.     UBYTE flg;          /* envelope flag */
  458.     UBYTE pts;            /* number of envelope points */
  459.     UBYTE sus;            /* envelope sustain index */
  460.     UBYTE beg;            /* envelope loop begin */
  461.     UBYTE end;            /* envelope loop end */
  462.     SWORD p;            /* current envelope counter */
  463.     UWORD a;            /* envelope index a */
  464.     UWORD b;            /* envelope index b */
  465.     ENVPT *env;            /* envelope points */
  466. } ENVPR;
  467.  
  468.  
  469. typedef struct AUDTMP{
  470.     INSTRUMENT     *i;
  471.     SAMPLE      *s;
  472.  
  473.         UWORD fadevol;          /* fading volume */
  474.  
  475.     ENVPR venv;
  476.     ENVPR penv;
  477.  
  478.     UBYTE keyon;        /* if true=key is pressed. */
  479.     UBYTE kick;            /* if true=sample has to be restarted */
  480.     UBYTE sample;        /* which sample number (0-31) */
  481.     SWORD handle;        /* which sample-handle */
  482.  
  483.     ULONG start;        /* The start byte index in the sample */
  484.  
  485.     UBYTE panning;        /* panning position */
  486.     UBYTE pansspd;        /* panslide speed */
  487.  
  488.     SBYTE volume;        /* amiga volume (0 t/m 64) to play the sample at */
  489.     UWORD period;        /* period to play the sample at */
  490.  
  491.     /* You should not have to use the values
  492.        below in the player routine */
  493.  
  494.     SBYTE transpose;
  495.  
  496.     UBYTE note;            /* */
  497.  
  498.     SWORD ownper;
  499.     SWORD ownvol;
  500.  
  501.     UBYTE *row;            /* row currently playing on this channel */
  502.  
  503.     SBYTE retrig;        /* retrig value (0 means don't retrig) */
  504.     UWORD c2spd;        /* what finetune to use */
  505.  
  506.     SBYTE tmpvolume;    /* tmp volume */
  507.  
  508.     UWORD tmpperiod;    /* tmp period */
  509.     UWORD wantedperiod;    /* period to slide to (with effect 3 or 5) */
  510.  
  511.     UWORD slidespeed;    /* */
  512.     UWORD portspeed;    /* noteslide speed (toneportamento) */
  513.  
  514.     UBYTE s3mtremor;    /* s3m tremor (effect I) counter */
  515.     UBYTE s3mtronof;    /* s3m tremor ontime/offtime */
  516.  
  517.     UBYTE s3mvolslide;    /* last used volslide */
  518.  
  519.     UBYTE s3mrtgspeed;    /* last used retrig speed */
  520.     UBYTE s3mrtgslide;    /* last used retrig slide */
  521.  
  522.     UBYTE glissando;    /* glissando (0 means off) */
  523.     UBYTE wavecontrol;    /* */
  524.  
  525.     SBYTE vibpos;        /* current vibrato position */
  526.     UBYTE vibspd;        /* "" speed */
  527.     UBYTE vibdepth;        /* "" depth */
  528.  
  529.     SBYTE trmpos;        /* current tremolo position */
  530.     UBYTE trmspd;        /* "" speed */
  531.     UBYTE trmdepth;        /* "" depth */
  532.  
  533.     UWORD soffset;        /* last used sample-offset (effect 9) */
  534. } AUDTMP;
  535.  
  536.  
  537. extern AUDTMP mp_audio[32];        /* max eight channels */
  538. extern UBYTE  mp_bpm;            /* beats-per-minute speed */
  539. extern UWORD  mp_patpos;        /* current row number (0-63) */
  540. extern SWORD  mp_sngpos;        /* current song position */
  541. extern UWORD  mp_sngspd;        /* current songspeed */
  542.  
  543. extern BOOL  mp_loop;
  544. extern BOOL  mp_panning;
  545. extern BOOL  mp_extspd;
  546. extern UBYTE mp_volume;
  547.  
  548. /*
  549.     player prototypes:
  550. */
  551.  
  552. int     MP_Ready(void);
  553. void MP_NextPosition(void);
  554. void MP_PrevPosition(void);
  555. void MP_SetPosition(UWORD pos);
  556. void MP_HandleTick(void);
  557. void MP_Init(UNIMOD *m);
  558.  
  559.  
  560. /**************************************************************************
  561. ****** Virtual channel stuff: *********************************************
  562. **************************************************************************/
  563.  
  564. BOOL    VC_Init(void);
  565. void    VC_Exit(void);
  566.  
  567. void    VC_PlayStart(void);
  568. void    VC_PlayStop(void);
  569.  
  570. SWORD   VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
  571. void    VC_SampleUnload(SWORD handle);
  572.  
  573. void    VC_WriteSamples(SBYTE *buf,UWORD todo);
  574. UWORD   VC_WriteBytes(SBYTE *buf,UWORD todo);
  575. void    VC_SilenceBytes(SBYTE *buf,UWORD todo);
  576.  
  577. void     VC_VoiceSetVolume(UBYTE voice,UBYTE vol);
  578. void     VC_VoiceSetFrequency(UBYTE voice,ULONG frq);
  579. void     VC_VoiceSetPanning(UBYTE voice,UBYTE pan);
  580. void     VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
  581.  
  582. char *strdup(char *str);
  583. #endif
  584.